package dale.web.common.page;

import java.io.Serializable;
import java.util.HashMap;

import org.slf4j.*;

import dale.web.common.Constants;
import dale.web.common.model.Condition;
import dale.web.english.model.English;

public class Pager implements Serializable {

	private static final Logger LOGGER = LoggerFactory.getLogger(Pager.class);
	private static final long serialVersionUID = 1L;
	
    private         boolean isPrevPage;     //이전페이지 존재여부
    private         boolean isNextPage;     //다음페이지 존재여부
    private       int             nowPage;        //현재페이지
    protected       int             rowTotal;       //총 게시물수
    private       int             listSize;      //한 페이지에 표시될 리스트수
    protected       int             blockSize;  //한 블럭에 표시될 페이지수
    private         int             totalPage;      //전체페이지수
    private         int             startPage;  //시작페이지
    private         int             endPage;        //마지막 페이지
    private         int             startRow;       //데이타베이스의 쿼리에서 사용할 시작값
    private         int             endRow;         //데이타베이스의 쿼리에서 사용할 종료값
    private         int             startNum;       //리스트 표기시 처음 시작 숫자
    
    public Pager(int nowPage, int rowTotal) {
        this(nowPage, rowTotal, Constants.DEFAULT_LIST_SIZE, Constants.DEFAULT_BLOCK_SIZE);
    }

    public Pager(Condition<?> condition, int rowTotal) {
    	this(condition.getPageNo(), rowTotal, condition.getListSize(), condition.getBlockSize());
	}
    
    /*
     *       페이지를 계산하는 생성자
     * nowPage:현재페이지
     * rowTotal : 총게시물수
     * blockList : 한페이지에 디스플레이될 게시물수
     * blockPage: 한 블럭에 표시될 페이지수
     */
    public Pager(int nowPage, int rowTotal, int listSize, int blockSize) {
            super();


            this.nowPage = nowPage;
            this.rowTotal   = rowTotal;
            this.listSize = listSize;
            this.blockSize  = blockSize;

            // 각종 플래그를 초기화
            isPrevPage      = false;
            isNextPage      = false;

            // 입력된 전체 열의 수를 통해 전체 페이지 수를 계산한다
            this.totalPage  = (int) Math.ceil((double)rowTotal / (double)listSize);

            // 현재 페이지가 전체 페이지수보다 클경우 전체 페이지수로 강제로 조정한다
            if(nowPage > this.totalPage) nowPage    = this.totalPage;

            //상기와 같을경우 totalPage가 0이고 nowPage가 1일경우 에러발생
            if(nowPage < 1)nowPage = 1;

            // DB입력을 위한 시작과 종료값을 구한다
            this.startRow   = (nowPage - 1) * listSize;
            this.endRow             = this.startRow + listSize - 1;

            // 시작페이지와 종료페이지의 값을 구한다
            this.startPage  = ((nowPage - 1) / blockSize) * blockSize + 1;
            this.endPage    = this.startPage + blockSize - 1;

            //리스트의 최상의 숫자를 구한다.
            this.startNum   = rowTotal - (listSize *( nowPage-1));//리스트될 경우 최상위 숫자


            // 마지막 페이지값이 전체 페이지값보다 클 경우 강제 조정
            if(this.endPage > this.totalPage) {
                    this.endPage    = totalPage;
            }

            // 시작 페이지가 1보다 클 경우 이전 페이징이 가능한것으로 간주한다
            if(this.startPage > 1) {
                    this.isPrevPage = true;
            }

            // 종료페이지가 전체페이지보다 작을경우 다음 페이징이 가능한것으로 간주한다
            if(this.endPage < this.totalPage) {
                    this.isNextPage = true;
            }

            // 기타 값을 저장한다
            this.nowPage = nowPage;
            this.rowTotal   = rowTotal;
            this.listSize = listSize;
            this.blockSize  = blockSize;
    }

	public void Debug() {
    	LOGGER.debug("input : nowPage :" + this.getNowPage() + " / rowTotal : " + this.rowTotal + " / listSize : " + this.getListSize() + " / blockSize : " + this.blockSize + " / totalPage : " + this.totalPage);
    	LOGGER.debug("Total Page : " + this.totalPage + " / Start Page : " + this.startPage + " / End Page : " + this.endPage);
    	LOGGER.debug("Total Row : " + this.rowTotal + " / Start Row : " + this.startRow + " / End Row : " + this.endRow);
    }

    // 전체 페이지 수를 알아온다
    public int getTotalPage() {
            return totalPage;
    }

    // 시작 Row값을 가져온다
	public int getStartRow() {
            return startRow;
    }

    // 마지막 Row값을 가져온다
    public int getEndRow() {
            return endRow;
    }

    // 시작페이지값을 가져온다
    public int getStartPage() {
            return startPage;
    }

    // 마지막 페이지값을 가져온다
    public int getEndPage() {
            return endPage;
    }
    
    /**
     * Get the current page number.
     */
    public int getNowPage() {
		return nowPage;
	}

    // 이전페이지의 존재유무를 가져온다
    public boolean isPrevPage() {
            return isPrevPage;
    }

    // 다음페이지의 존재유무를 가져온다
    public boolean isNextPage() {
            return isNextPage;
    }

    // 리스트 표기시 처음 시작 숫자를 가져온다.
    public int getStartNum() {
            return startNum;
    }
    
	public int getListSize() {
		return listSize;
	}


    public HashMap<String, String> getParams() {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("isPrevPage",new Boolean(isPrevPage).toString());
            params.put("isNextPage",new Boolean(isNextPage).toString());

            params.put("nowPage",Integer.toString(getNowPage()));
            params.put("rowTotal",Integer.toString(rowTotal));
            params.put("blockList",Integer.toString(listSize));
            params.put("blockPage",Integer.toString(blockSize));
            params.put("totalPage",Integer.toString(totalPage));
            params.put("startPage",Integer.toString(startPage));
            params.put("endPage",Integer.toString(endPage));
            params.put("startRow",Integer.toString(startRow));
            params.put("endRow",Integer.toString(endRow));
            params.put("startNum",Integer.toString(startNum));
            return params;
    }
    
}
